Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to compiler v20160713 #421

Merged
merged 1 commit into from
Jul 26, 2016
Merged

Update to compiler v20160713 #421

merged 1 commit into from
Jul 26, 2016

Conversation

hochhaus
Copy link
Contributor

Note, this PR depends upon #420.

@@ -121,7 +121,8 @@ def get(*args):

# Ignore missing goog.require since we assume the whole library is
# already included.
opts = ['--jscomp_off=missingRequire', '--checks-only', '-O', 'SIMPLE']
opts = ['--jscomp_off=missingRequire', '--jscomp_off=lintChecks',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we no longer passing lintChecks? Why is that?

Copy link
Contributor Author

@hochhaus hochhaus Jun 26, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regrettably, the compiler contains two different variants of the "missing require" check (MISSING_REQUIRE_WARNING, MISSING_REQUIRE_CALL_WARNING). Some legacy code is preventing MISSING_REQUIRE_CALL_WARNING from being included with the "missingRequire" diagnostic group but rather it is included in "lintChecks".

Said differently, all of the lintChecks besides MISSING_REQUIRE_CALL_WARNING still pass. Without adding lintChecks we get the following errors:

/home/ahochhaus/shaka-player2/demo/asset_section.js:30: ERROR - missing require: 'shakaAssets.testAssets'
  shakaAssets.testAssets.forEach(function(asset) {
  ^

/home/ahochhaus/shaka-player2/demo/asset_section.js:194: ERROR - missing require: 'shaka.log'
      shaka.log.debug('load() interrupted');
      ^

/home/ahochhaus/shaka-player2/demo/configuration_section.js:59: ERROR - missing require: 'shakaDemo.player_'
  shakaDemo.player_.configure(/** @type {shakaExtern.PlayerConfiguration} */({
  ^

/home/ahochhaus/shaka-player2/demo/configuration_section.js:71: ERROR - missing require: 'shakaDemo.controls_'
  shakaDemo.controls_.showTrickPlay(event.target.checked);
  ^

/home/ahochhaus/shaka-player2/demo/info_section.js:28: ERROR - missing require: 'shakaDemo.player_'
  shakaDemo.player_.addEventListener(
  ^

/home/ahochhaus/shaka-player2/demo/info_section.js:107: ERROR - missing require: 'shakaDemo.player_'
  var tracks = shakaDemo.player_.getTracks();
               ^

/home/ahochhaus/shaka-player2/demo/log_section.js:91: ERROR - missing require: 'shaka.log'
  shaka.log.setLevel(shaka.log.currentLevel);
  ^

/home/ahochhaus/shaka-player2/demo/main.js:79: ERROR - missing require: 'shaka.log'
    shaka.log.setLevel(shaka.log.Level.DEBUG);
    ^

/home/ahochhaus/shaka-player2/demo/main.js:84: ERROR - missing require: 'shaka.polyfill'
  shaka.polyfill.installAll();
  ^

/home/ahochhaus/shaka-player2/demo/main.js:86: ERROR - missing require: 'shaka.Player'
  if (!shaka.Player.isBrowserSupported()) {
       ^

/home/ahochhaus/shaka-player2/demo/main.js:112: ERROR - missing require: 'shaka.Player'
    shaka.Player.probeSupport().then(function(support) {
    ^

/home/ahochhaus/shaka-player2/test/cancelable_chain_unit.js:185: ERROR - missing require: 'shaka.test.Util'
      shaka.test.Util.delay(0.1).then(function() {
      ^

/home/ahochhaus/shaka-player2/test/dash_parser_content_protection_unit.js:33: ERROR - missing require: 'shaka.net.NetworkingEngine'
    var retry = shaka.net.NetworkingEngine.defaultRetryParameters();
                ^

/home/ahochhaus/shaka-player2/test/dash_parser_content_protection_unit.js:125: ERROR - missing require: 'shaka.util.Uint8ArrayUtils'
        initData: shaka.util.Uint8ArrayUtils.fromBase64(base64)
                  ^

/home/ahochhaus/shaka-player2/test/dash_parser_content_protection_unit.js:219: ERROR - missing require: 'shaka.test.Dash'
    var expected = shaka.test.Dash.makeManifestFromStreamSets([
                   ^

/home/ahochhaus/shaka-player2/test/dash_parser_live_unit.js:30: ERROR - missing require: 'shaka.net.NetworkingEngine'
    var retry = shaka.net.NetworkingEngine.defaultRetryParameters();
                ^

/home/ahochhaus/shaka-player2/test/dash_parser_live_unit.js:430: ERROR - missing require: 'shaka.util.StringUtils'
            var data = shaka.util.StringUtils.toUTF8(manifest);
                       ^

/home/ahochhaus/shaka-player2/test/dash_parser_live_unit.js:853: ERROR - missing require: 'shaka.test.Dash'
      shaka.test.Dash.makeReference('s4.mp4', 4, 30, 40)
      ^

/home/ahochhaus/shaka-player2/test/dash_parser_manifest_unit.js:27: ERROR - missing require: 'shaka.test.Dash'
    parser = shaka.test.Dash.makeDashParser();
             ^

/home/ahochhaus/shaka-player2/test/dash_parser_manifest_unit.js:555: ERROR - missing require: 'shaka.util.StringUtils'
          var data = shaka.util.StringUtils.toUTF8(source);
                     ^

/home/ahochhaus/shaka-player2/test/dash_parser_segment_base_unit.js:30: ERROR - missing require: 'shaka.test.Dash'
    parser = shaka.test.Dash.makeDashParser();
             ^

/home/ahochhaus/shaka-player2/test/dash_parser_segment_list_unit.js:30: ERROR - missing require: 'shaka.test.Dash'
    parser = shaka.test.Dash.makeDashParser();
             ^

/home/ahochhaus/shaka-player2/test/dash_parser_segment_list_unit.js:33: ERROR - missing require: 'shaka.test.Dash'
  shaka.test.Dash.makeTimelineTests('SegmentList', '', [
  ^

/home/ahochhaus/shaka-player2/test/dash_parser_segment_template_unit.js:30: ERROR - missing require: 'shaka.test.Dash'
    parser = shaka.test.Dash.makeDashParser();
             ^

/home/ahochhaus/shaka-player2/test/dash_parser_segment_template_unit.js:33: ERROR - missing require: 'shaka.test.Dash'
  shaka.test.Dash.makeTimelineTests(
  ^

/home/ahochhaus/shaka-player2/test/data_uri_plugin_unit.js:22: ERROR - missing require: 'shaka.net.NetworkingEngine'
    retryParameters = shaka.net.NetworkingEngine.defaultRetryParameters();
                      ^

/home/ahochhaus/shaka-player2/test/data_uri_plugin_unit.js:78: ERROR - missing require: 'shaka.util.StringUtils'
          var data = shaka.util.StringUtils.fromBytesAutoDetect(response.data);
                     ^

/home/ahochhaus/shaka-player2/test/data_uri_plugin_unit.js:87: ERROR - missing require: 'shaka.net.NetworkingEngine'
        shaka.net.NetworkingEngine.makeRequest([uri], retryParameters);
        ^

/home/ahochhaus/shaka-player2/test/data_uri_plugin_unit.js:88: ERROR - missing require: 'shaka.net.DataUriPlugin'
    shaka.net.DataUriPlugin(uri, request)
    ^

/home/ahochhaus/shaka-player2/test/db_engine_unit.js:31: ERROR - missing require: 'shaka.offline.DBEngine'
    shaka.offline.DBEngine.deleteDatabase().then(function() {
    ^

/home/ahochhaus/shaka-player2/test/db_engine_unit.js:117: ERROR - missing require: 'shaka.test.Util'
      shaka.test.Util.expectToEqualError(error, expectedError);
      ^

/home/ahochhaus/shaka-player2/test/db_engine_unit.js:126: ERROR - missing require: 'shaka.test.Util'
          return shaka.test.Util.delay(0.001);
                 ^

/home/ahochhaus/shaka-player2/test/drm_engine_integration.js:47: ERROR - missing require: 'shaka.media.DrmEngine'
    var supportTest = shaka.media.DrmEngine.probeSupport()
                      ^

/home/ahochhaus/shaka-player2/test/drm_engine_integration.js:73: ERROR - missing require: 'shaka.net.HttpPlugin'
      shaka.net.HttpPlugin(audioSegmentUri, dummyRequest)
      ^

/home/ahochhaus/shaka-player2/test/drm_engine_integration.js:282: ERROR - missing require: 'shaka.net.NetworkingEngine'
        retryParameters: shaka.net.NetworkingEngine.defaultRetryParameters(),
                         ^

/home/ahochhaus/shaka-player2/test/drm_engine_integration.js:350: ERROR - missing require: 'shaka.test.Util'
        shaka.test.Util.expectToEqualError(
        ^

/home/ahochhaus/shaka-player2/test/drm_engine_integration.js:386: ERROR - missing require: 'shaka.test.Util'
        return Promise.race([shaka.test.Util.delay(6), onErrorCalled]);
                             ^

/home/ahochhaus/shaka-player2/test/drm_engine_unit.js:99: ERROR - missing require: 'shaka.net.NetworkingEngine'
    var retryParameters = shaka.net.NetworkingEngine.defaultRetryParameters();
                          ^

/home/ahochhaus/shaka-player2/test/drm_engine_unit.js:563: ERROR - missing require: 'shaka.util.StringUtils'
        var initData = JSON.parse(shaka.util.StringUtils.fromUTF8(
                                  ^

/home/ahochhaus/shaka-player2/test/drm_engine_unit.js:898: ERROR - missing require: 'shaka.net.DataUriPlugin'
        return shaka.net.DataUriPlugin(request.uris[0], request);
               ^

/home/ahochhaus/shaka-player2/test/drm_engine_unit.js:910: ERROR - missing require: 'shaka.util.StringUtils'
            shaka.util.StringUtils.fromBytesAutoDetect(licenseBuffer);
            ^

/home/ahochhaus/shaka-player2/test/drm_engine_unit.js:942: ERROR - missing require: 'shaka.test.Util'
        shaka.test.Util.expectToEqualError(error, new shaka.util.Error(
        ^

/home/ahochhaus/shaka-player2/test/drm_engine_unit.js:1271: ERROR - missing require: 'shaka.test.Util'
        return shaka.test.Util.delay(0.1);
               ^

/home/ahochhaus/shaka-player2/test/ebml_parser_unit.js:238: ERROR - missing require: 'shaka.util.EbmlParser'
      shaka.util.EbmlParser.getVintValue_(data);
      ^

/home/ahochhaus/shaka-player2/test/fake_event_target_unit.js:132: ERROR - missing require: 'shaka.test.Util'
    shaka.test.Util.delay(0.1).then(function() {
    ^

/home/ahochhaus/shaka-player2/test/http_plugin_unit.js:48: ERROR - missing require: 'shaka.net.NetworkingEngine'
    retryParameters = shaka.net.NetworkingEngine.defaultRetryParameters();
                      ^

/home/ahochhaus/shaka-player2/test/http_plugin_unit.js:128: ERROR - missing require: 'shaka.net.NetworkingEngine'
    var request = shaka.net.NetworkingEngine.makeRequest(
                  ^

/home/ahochhaus/shaka-player2/test/http_plugin_unit.js:130: ERROR - missing require: 'shaka.net.HttpPlugin'
    shaka.net.HttpPlugin(uri, request)
    ^

/home/ahochhaus/shaka-player2/test/networking_engine_unit.js:49: ERROR - missing require: 'shaka.net.NetworkingEngine'
    shaka.net.NetworkingEngine.registerScheme('reject', rejectScheme);
    ^

/home/ahochhaus/shaka-player2/test/networking_engine_unit.js:239: ERROR - missing require: 'shaka.net.NetworkingEngine'
      shaka.net.NetworkingEngine.unregisterScheme('resolve');
      ^

/home/ahochhaus/shaka-player2/test/networking_engine_unit.js:630: ERROR - missing require: 'shaka.net.NetworkingEngine'
                          shaka.net.NetworkingEngine.defaultRetryParameters();
                          ^

/home/ahochhaus/shaka-player2/test/networking_engine_unit.js:631: ERROR - missing require: 'shaka.net.NetworkingEngine'
    return shaka.net.NetworkingEngine.makeRequest([uri], retryParameters);
           ^

/home/ahochhaus/shaka-player2/test/offline_integration.js:33: ERROR - missing require: 'shaka.Player'
    var supportPromise = shaka.Player.probeSupport()
                         ^

/home/ahochhaus/shaka-player2/test/offline_integration.js:41: ERROR - missing require: 'shaka.offline.DBEngine'
    Promise.all([shaka.offline.DBEngine.deleteDatabase(), supportPromise])
                 ^

/home/ahochhaus/shaka-player2/test/offline_integration.js:115: ERROR - missing require: 'shaka.test.Util'
      shaka.test.Util.expectToEqualError(e, expected);
      ^

/home/ahochhaus/shaka-player2/test/offline_integration.js:129: ERROR - missing require: 'shaka.test.Util'
          return shaka.test.Util.delay(5);
                 ^

/home/ahochhaus/shaka-player2/test/player_unit.js:120: ERROR - missing require: 'shaka.log'
        shaka.log.debug('finished unload 2');
        ^

/home/ahochhaus/shaka-player2/test/player_unit.js:253: ERROR - missing require: 'shaka.media.ManifestParser'
        shaka.media.ManifestParser.registerParserByMime('undefined', factory1);
        ^

/home/ahochhaus/shaka-player2/test/player_unit.js:335: ERROR - missing require: 'shaka.test.Util'
        shaka.test.Util.delay(0.5).then(function() {
        ^

/home/ahochhaus/shaka-player2/test/player_unit.js:1223: ERROR - missing require: 'shaka.test.Util'
        shaka.test.Util.expectToEqualError(
        ^

/home/ahochhaus/shaka-player2/test/simple_abr_manager_unit.js:278: ERROR - missing require: 'shaka.test.Util'
    var delay = shaka.test.Util.fakeEventLoop(
                ^

/home/ahochhaus/shaka-player2/test/storage_unit.js:636: ERROR - missing require: 'shaka.test.Util'
            shaka.test.Util.expectToEqualError(
            ^

/home/ahochhaus/shaka-player2/test/streaming_engine_integration.js:147: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
      timeline = shaka.test.StreamingEngineUtil.createFakePresentationTimeline(
                 ^

/home/ahochhaus/shaka-player2/test/streaming_engine_integration.js:205: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
        shaka.test.StreamingEngineUtil.boundsCheckPosition.bind(
        ^

/home/ahochhaus/shaka-player2/test/streaming_engine_integration.js:209: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
        shaka.test.StreamingEngineUtil.getNumSegments.bind(
        ^

/home/ahochhaus/shaka-player2/test/streaming_engine_integration.js:214: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
    netEngine = shaka.test.StreamingEngineUtil.createFakeNetworkingEngine(
                ^

/home/ahochhaus/shaka-player2/test/streaming_engine_integration.js:257: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
    manifest = shaka.test.StreamingEngineUtil.createManifest(
               ^

/home/ahochhaus/shaka-player2/test/streaming_engine_integration.js:293: ERROR - missing require: 'shaka.net.NetworkingEngine'
      retryParameters: shaka.net.NetworkingEngine.defaultRetryParameters(),
                       ^

/home/ahochhaus/shaka-player2/test/streaming_engine_unit.js:232: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
    timeline = shaka.test.StreamingEngineUtil.createFakePresentationTimeline(
               ^

/home/ahochhaus/shaka-player2/test/streaming_engine_unit.js:248: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
    netEngine = shaka.test.StreamingEngineUtil.createFakeNetworkingEngine(
                ^

/home/ahochhaus/shaka-player2/test/streaming_engine_unit.js:266: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
    manifest = shaka.test.StreamingEngineUtil.createManifest(
               ^

/home/ahochhaus/shaka-player2/test/streaming_engine_unit.js:304: ERROR - missing require: 'shaka.test.StreamingEngineUtil'
        shaka.test.StreamingEngineUtil.createMockVideoStream(6);
        ^

/home/ahochhaus/shaka-player2/test/streaming_engine_unit.js:1730: ERROR - missing require: 'shaka.net.NetworkingEngine'
        retryParameters: shaka.net.NetworkingEngine.defaultRetryParameters(),
                         ^

/home/ahochhaus/shaka-player2/test/support_check.js:20: ERROR - missing require: 'shaka.Player'
    if (!shaka.Player.isBrowserSupported()) {
         ^

/home/ahochhaus/shaka-player2/test/support_check.js:22: ERROR - missing require: 'shaka.test.Util'
      shaka.test.Util.cancelAllRemainingSpecs();
      ^

/home/ahochhaus/shaka-player2/test/util/dash_parser_util.js:26: ERROR - missing require: 'shaka.net.NetworkingEngine'
  var retry = shaka.net.NetworkingEngine.defaultRetryParameters();
              ^

/home/ahochhaus/shaka-player2/test/util/dash_parser_util.js:102: ERROR - missing require: 'shaka.util.StringUtils'
  var manifestData = shaka.util.StringUtils.toUTF8(manifestText);
                     ^

/home/ahochhaus/shaka-player2/test/util/dash_parser_util.js:110: ERROR - missing require: 'shaka.test.Util'
        shaka.test.Util.expectToEqualError(error, expectedError);
        ^

/home/ahochhaus/shaka-player2/test/util/manifest_generator.js:262: ERROR - missing require: 'shaka.util.Uint8ArrayUtils'
  var buffer = shaka.util.Uint8ArrayUtils.fromBase64(base64);
               ^

/home/ahochhaus/shaka-player2/test/util/manifest_generator.js:541: ERROR - missing require: 'goog.asserts'
  goog.asserts.assert(streamSet.streams.length > 0,
  ^

/home/ahochhaus/shaka-player2/test/util/memory_db_engine.js:85: ERROR - missing require: 'shaka.util.MapUtils'
  shaka.util.MapUtils.values(this.getStore_(storeName)).forEach(callback);
  ^

/home/ahochhaus/shaka-player2/test/util/memory_db_engine.js:135: ERROR - missing require: 'goog.asserts'
  goog.asserts.assert(storeName in this.stores_,
  ^

/home/ahochhaus/shaka-player2/test/util/stream_generator.js:482: ERROR - missing require: 'goog.asserts'
  goog.asserts.assert(
  ^

/home/ahochhaus/shaka-player2/test/util/stream_generator.js:500: ERROR - missing require: 'shaka.log'
    shaka.log.debug('tfdt box is version 1.');
    ^

/home/ahochhaus/shaka-player2/test/util/util.js:277: ERROR - missing require: 'shaka.log'
    shaka.log.setLevel(shaka.log.Level.INFO);
    ^

/home/ahochhaus/shaka-player2/test/util/util.js:279: ERROR - missing require: 'shaka.polyfill'
  shaka.polyfill.installAll();
  ^

/home/ahochhaus/shaka-player2/test/vtt_text_parser_unit.js:280: ERROR - missing require: 'shaka.util.StringUtils'
    var data = shaka.util.StringUtils.toUTF8(string);
               ^

/home/ahochhaus/shaka-player2/test/vtt_text_parser_unit.js:282: ERROR - missing require: 'shaka.media.VttTextParser'
      shaka.media.VttTextParser(data);
      ^

88 error(s), 0 warning(s)

Do you know of a better solution?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not off-hand, but I do note that all of those lint check failures are about goog.requires in demo/ and test/, which do not use goog.require in the first place. I would strongly prefer not to disable useful checks on the library just to exclude them from test and demo app code.

@hochhaus
Copy link
Contributor Author

Thanks for the very prompt review!

PTAL

@hochhaus
Copy link
Contributor Author

@joeyparrish Could you please take another look at this updated change?

@@ -237,6 +237,11 @@ shaka.offline.DownloadManager.prototype.updateProgress_ = function() {
(this.givenBytesTotal_ + this.bandwidthBytesTotal_);

goog.asserts.assert(this.manifest_, 'Must not be destroyed');
/**
* TODO(hochhaus): Resolve circular dependency.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filed as #431 and assigned to one of my teammates.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We pushed a fix for #431, so you should be able to rebase your work and see this fixed.

@joeyparrish
Copy link
Member

I recommend splitting this PR up. Most of these changes are easy to accept (fixing semicolons, annotations, etc.), so we can go ahead and land those. I don't think we are ready to land the new compiler, though, until we find a way to address the lint check errors, and that may take more time.

If we split up the PR, we can land the less controversial parts relatively quickly and avoid having to rebase those changes many times as we continue to push changes from our end.

@hochhaus
Copy link
Contributor Author

hochhaus commented Jul 24, 2016

@joeyparrish Thanks for your feedback. I broke up this change into pull reuests per your recommendation hoping to make them a bit easier to merge.

This change depends upon #453, #454, #455, #456, #457, #458, #459. However all of the other changes should be independent of one another and can be reviewed/merged in any order.

PTAL

@hochhaus hochhaus changed the title Update to compiler v20160619. Update to compiler v20160713 Jul 24, 2016
@hochhaus
Copy link
Contributor Author

Updated to include the {width,height} string to number conversion.

PTAL

shaka-bot pushed a commit that referenced this pull request Jul 25, 2016
 * Drop unnecessary type alternation in SegmentIndex unit tests
 * Drop unnecessary bind in StreamingEngine unit tests
 * Drop unnecessary expose annotations in Pssh
 * Add comments about quoted access in cast unit tests
 * Move afterAll() position in cast unit tests
 * Make return type for PublicPromise constructor more specific
 * Define a type for Util.eventLoop return value

Related to PR #421

Change-Id: I092a8ff366b4ac4ea868dd3f4fbe4e3d63a2167f
@shaka-bot
Copy link
Collaborator

Testing in progress...

@shaka-bot
Copy link
Collaborator

Failure:

+ echo START-BUILD
START-BUILD
+ ./build/all.py
156 files checked, no errors found.

   Config loaded: �[36m/var/lib/jenkins/jobs/Manual PR Test/workspace/.htmlhintrc�[39m

   Config loaded: �[36m/var/lib/jenkins/jobs/Manual PR Test/workspace/.htmlhintrc�[39m

   Config loaded: �[36m/var/lib/jenkins/jobs/Manual PR Test/workspace/.htmlhintrc�[39m

�[32mScan 3 files, without errors (29 ms).�[39m
/var/lib/jenkins/jobs/Manual PR Test/workspace/lib/offline/storage.js:262: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  }.bind(this)).then(function(/** ?shakaExtern.ManifestDB */ data) {
                     ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/lib/util/public_promise.js:31: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
shaka.util.PublicPromise = function() {
                           ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/cast/cast_proxy_unit.js:647: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  function createMockCastSender(
  ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/cast/cast_receiver_unit.js:607: ERROR - Useless empty statement. Remove semicolon.
  };
   ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/dash/dash_parser_manifest_unit.js:50: ERROR - Useless empty statement. Remove semicolon.
    };
     ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/dash/dash_parser_manifest_unit.js:64: ERROR - Useless empty statement. Remove semicolon.
    };
     ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/dash/dash_parser_manifest_unit.js:97: ERROR - Useless empty statement. Remove semicolon.
  };
   ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/media/mp4_vtt_parser_unit.js:127: ERROR - Useless empty statement. Remove semicolon.
  };
   ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/media/segment_index_unit.js:335: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  function uri(x) {
  ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/media/streaming_engine_integration.js:266: ERROR - Useless empty statement. Remove semicolon.
    function makeUris(uri) { return function() { return [uri]; }; };
                                                                   ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/media/streaming_engine_integration.js:526: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  function defaultOnChooseStreams(period) {
  ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/media/streaming_engine_unit.js:62: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  function runTest(opt_callback) {
  ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/media/streaming_engine_unit.js:1947: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  function defaultOnChooseStreams(period) {
  ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/offline/offline_integration.js:141: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
        .then(/** @suppress {accessControls} */ function() {
                                                ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/player_unit.js:1270: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
  function chooseStreams() {
  ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/test/util/dash_parser_util.js:250: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
    function makeManifestText(timeline, testAttrs, opt_dur, opt_start) {
    ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/test/util/dash_parser_util.js:255: ERROR - Useless empty statement. Remove semicolon.
    };
     ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/test/util/simple_fakes.js:94: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
shaka.test.FakeDrmEngine = function() {
                           ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/test/test/util/simple_fakes.js:150: ERROR - Function with non-trivial return must have @return JSDoc or inline return JSDoc.
shaka.test.FakeStreamingEngine = function(period) {
                                 ^

/var/lib/jenkins/jobs/Manual PR Test/workspace/third_party/closure/goog/base.js:803: ERROR - Useless empty statement. Remove semicolon.
  function tempCtor() {};
                        ^

20 error(s), 0 warning(s)
Build failed
Generating Closure dependencies...
Running Closure linter...
Running htmlhint...
Checking that the build files are complete...
Checking the tests for type errors...
Build step 'Execute shell' marked build as failure

@joeyparrish
Copy link
Member

Perhaps this needs a quick rebase?

@hochhaus
Copy link
Contributor Author

Rebased.

PTAL

@shaka-bot
Copy link
Collaborator

Testing in progress...

@shaka-bot
Copy link
Collaborator

Failure:

+ echo START-BUILD
START-BUILD
+ ./build/all.py
156 files checked, no errors found.

   Config loaded: �[36m/var/lib/jenkins/jobs/Manual PR Test/workspace/.htmlhintrc�[39m

   Config loaded: �[36m/var/lib/jenkins/jobs/Manual PR Test/workspace/.htmlhintrc�[39m

   Config loaded: �[36m/var/lib/jenkins/jobs/Manual PR Test/workspace/.htmlhintrc�[39m

�[32mScan 3 files, without errors (27 ms).�[39m
/var/lib/jenkins/jobs/Manual PR Test/workspace/test/test/util/memory_db_engine.js:52: ERROR - condition always evaluates to false
left : null
right: null
  return this.stores_ != null;
         ^

1 error(s), 0 warning(s), 90.6% typed
Build failed
Generating Closure dependencies...
Running Closure linter...
Running htmlhint...
Checking that the build files are complete...
Checking the tests for type errors...
Build step 'Execute shell' marked build as failure

@hochhaus
Copy link
Contributor Author

Strange, this did not happen locally for me. Looking more.

@hochhaus
Copy link
Contributor Author

Hmmm, I'm having no luck reproducing this. Do you have any hints for what might be different on the shaka-player-bot machine?

@joeyparrish
Copy link
Member

I'm getting two failures on my Linux workstation, neither of which make any sense to me:

Checking the tests for type errors...
/usr/local/google/home/joeyparrish/hacking/shaka/js/test/test/util/fake_media_source_engine.js:149: ERROR - mismatch of the bufferedAheadOf property type and the type of the property it overrides from superclass shaka.media.MediaSourceEngine
original: function (this:shaka.media.MediaSourceEngine, string, number, number=): number
override: function (this:shaka.test.FakeMediaSourceEngine, ?, ?, ?): ?
shaka.test.FakeMediaSourceEngine.prototype.bufferedAheadOf = function(
^

/usr/local/google/home/joeyparrish/hacking/shaka/js/test/test/util/memory_db_engine.js:52: ERROR - condition always evaluates to false
left : null
right: null
  return this.stores_ != null;
         ^

I believe these are both compiler bugs. The first is a failure to infer types in an override, even though they are identical. The second is clearly not correct. this.stores_ != null is obviously not always false.

@joeyparrish
Copy link
Member

Replacing this.stores_ != null with !!this.stores_ seems to work for the second failure. It shouldn't be necessary, but it works. Maybe do that with a // TODO: report closure-compiler bug.

Still trying to figure out the FakeMediaSourceEngine failure, which the build bot seems not to have. I think we could call the nondeterministic behavior a compiler bug, as well.

@joeyparrish
Copy link
Member

Looks like you can work around FakeMediaSourceEngine by adding explicit parameter and return annotations to bufferedAheadOf. Again, something you shouldn't have to do. Another TODO: report closure-compiler bug on that as well, please.

@joeyparrish
Copy link
Member

One more request: It looks like with the new compiler and these two changes, we now pass 'analyzerChecks'. Would you please remove --jscomp_off=analyzerChecks from build/build.py? Thanks!

@hochhaus
Copy link
Contributor Author

hochhaus commented Jul 26, 2016

I still have been unable to reproduce any failures. I tried 32 and 64 bit linux kernels with openjdk 7, 8 and 9.

Can you share which jdk you are seeing the failures on?

Something strange is going on because my linux desktop (as well as a digital ocean droplet I just spun up) compile without errors. The shaka-player-bot host compiles with one error and your machine compiles with two errors.

@hochhaus
Copy link
Contributor Author

After getting much debugging help from @dbhoot I think the source of this issue might be that the build scripts use os.walk() to determine the order in which input files are passed to the compiler. As the order of files returned from os.walk() is dependent on the directory entries in the file system this leads to unpredictable results across machines.

I'll look into turning on --dependency_mode in another change in order to have the compiler pre-sort the files.

For example, this ordering of files results in an error:

java -jar third_party/closure/compiler.jar \
--language_in ECMASCRIPT5 \
--language_out ECMASCRIPT3 \
--jscomp_error=* \
--jscomp_off=deprecatedAnnotations \
--extra_annotation_name=listens \
--extra_annotation_name=exportDoc \
--conformance_configs build/conformance.textproto \
-O ADVANCED \
--generate_exports \
--output_wrapper_file=build/wrapper.template.js \
-D COMPILED=true \
-D goog.DEBUG=false \
-D goog.STRICT_MODE_COMPATIBLE=true \
-D goog.ENABLE_DEBUG_LOADER=false \
-D goog.asserts.ENABLE_ASSERTS=false \
-D shaka.log.MAX_LOG_LEVEL=0 \
-D 'GIT_VERSION="v2.0.0-beta2-138-ge7c29c0"' \
--jscomp_off=missingRequire \
--jscomp_off=strictMissingRequire \
--checks-only \
-O SIMPLE \
test/test/util/fake_media_source_engine.js \
third_party/closure/goog/base.js \
lib/dash/segment_base.js \
lib/polyfill/patchedmediakeys_ms.js \
demo/assets.js \
lib/util/array_utils.js \
test/media/playhead_unit.js \
lib/offline/db_engine.js \
lib/dash/segment_template.js \
lib/media/ttml_text_parser.js \
test/media/streaming_engine_integration.js \
test/test/util/simple_fakes.js \
test/media/drm_engine_integration.js \
lib/net/data_uri_plugin.js \
test/media/media_source_engine_integration.js \
lib/util/text_parser.js \
externs/shaka/manifest.js \
externs/shaka/net.js \
externs/jwk_set.js \
externs/shaka/offline.js \
third_party/closure/goog/uri/uri.js \
third_party/closure/goog/uri/utils.js \
lib/cast/cast_receiver.js \
externs/prefixed_eme.js \
demo/receiver_app.js \
externs/shaka/manifest_parser.js \
lib/media/manifest_parser.js \
test/cast/cast_utils_unit.js \
lib/util/xml_utils.js \
lib/util/language_utils.js \
lib/debug/log.js \
test/dash/dash_parser_segment_base_unit.js \
lib/dash/content_protection.js \
test/util/cancelable_chain_unit.js \
test/test/util/dash_parser_util.js \
externs/shaka/player.js \
lib/util/fake_event.js \
lib/cast/cast_proxy.js \
lib/abr/simple_abr_manager.js \
lib/util/uint8array_utils.js \
lib/media/playhead.js \
test/offline/db_engine_unit.js \
lib/debug/asserts.js \
test/media/drm_engine_unit.js \
test/media/text_engine_unit.js \
lib/dash/mpd_utils.js \
lib/media/presentation_timeline.js \
test/dash/dash_parser_content_protection_unit.js \
test/media/mp4_segment_index_parser_unit.js \
lib/media/streaming_engine.js \
lib/util/config_utils.js \
test/media/mp4_vtt_parser_unit.js \
test/test/util/util.js \
test/test/util/streaming_engine_util.js \
test/test/externs/jasmine.js \
externs/shaka/abr_manager.js \
test/util/data_view_reader_unit.js \
lib/polyfill/promise.js \
test/cast/cast_sender_unit.js \
test/media/streaming_engine_unit.js \
test/dash/dash_parser_live_unit.js \
lib/util/timer.js \
lib/dash/segment_list.js \
test/offline/storage_unit.js \
lib/util/ebml_parser.js \
test/offline/offline_integration.js \
test/test/externs/karma.js \
lib/offline/download_manager.js \
test/util/ebml_parser_unit.js \
externs/fullscreen.js \
test/dash/mpd_utils_unit.js \
lib/util/multi_map.js \
test/net/networking_engine_unit.js \
test/test/externs/sprintf.js \
test/media/media_source_engine_unit.js \
lib/util/i_destroyable.js \
lib/polyfill/videoplaybackquality.js \
demo/controls.js \
lib/media/webm_segment_index_parser.js \
test/test/util/manifest_generator.js \
demo/info_section.js \
test/cast/cast_proxy_unit.js \
test/dash/dash_parser_segment_list_unit.js \
test/dash/dash_parser_manifest_unit.js \
lib/abr/ewma.js \
test/util/event_manager_unit.js \
lib/net/networking_engine.js \
lib/media/drm_engine.js \
lib/cast/cast_utils.js \
lib/util/fake_event_target.js \
test/util/string_utils_unit.js \
lib/player.js \
test/test/util/test_scheme.js \
demo/offline_section.js \
externs/xmlhttprequest.js \
lib/polyfill/fullscreen.js \
demo/main.js \
test/player_unit.js \
lib/offline/offline_utils.js \
lib/util/data_view_reader.js \
externs/chromecast.js \
lib/media/media_source_engine.js \
test/test/util/fake_networking_engine.js \
test/media/segment_index_unit.js \
test/util/text_parser_unit.js \
lib/util/string_utils.js \
externs/shaka/namespace.js \
demo/asset_section.js \
lib/util/public_promise.js \
lib/media/vtt_text_parser.js \
lib/media/time_ranges_utils.js \
test/media/mp4_ttml_parser_unit.js \
test/net/http_plugin_unit.js \
test/util/pssh_unit.js \
lib/dash/dash_parser.js \
lib/polyfill/all.js \
demo/log_section.js \
test/player_integration.js \
test/test/util/memory_db_engine.js \
externs/msmediakeys.js \
lib/polyfill/mediakeys.js \
test/media/ttml_text_parser_unit.js \
lib/offline/storage.js \
test/abr/simple_abr_manager_unit.js \
test/media/presentation_timeline_unit.js \
externs/mediakeys.js \
lib/util/functional.js \
lib/offline/offline_scheme.js \
test/util/fake_event_target_unit.js \
test/test/util/stream_generator.js \
lib/media/text_engine.js \
lib/media/segment_reference.js \
lib/util/pssh.js \
lib/debug/timer.js \
lib/polyfill/patchedmediakeys_webkit.js \
test/dash/dash_parser_segment_template_unit.js \
lib/media/segment_index.js \
test/test/externs/require.js \
lib/media/mp4_vtt_parser.js \
lib/util/event_manager.js \
test/util/xml_utils_unit.js \
test/cast/cast_receiver_unit.js \
lib/polyfill/patchedmediakeys_nop.js \
demo/load.js \
demo/demo_utils.js \
lib/media/mp4_segment_index_parser.js \
lib/util/map_utils.js \
test/net/data_uri_plugin_unit.js \
test/media/vtt_text_parser_unit.js \
lib/media/mp4_ttml_parser.js \
lib/net/http_plugin.js \
lib/util/mp4_parser.js \
lib/abr/ewma_bandwidth_estimator.js \
lib/util/cancelable_chain.js \
demo/configuration_section.js \
lib/cast/cast_sender.js \
lib/util/error.js \
lib/offline/offline_manifest_parser.js \
lib/util/stream_utils.js;

The error is:

test/test/util/fake_media_source_engine.js:149: ERROR - mismatch of the bufferedAheadOf property type and the type of the property it overrides from superclass shaka.media.MediaSourceEngine
original: function (this:shaka.media.MediaSourceEngine, string, number, number=): number
override: function (this:shaka.test.FakeMediaSourceEngine, ?, ?, ?): ?
shaka.test.FakeMediaSourceEngine.prototype.bufferedAheadOf = function(
^

1 error(s), 0 warning(s), 90.5% typed

However, this ordering of files results in no error:

java -jar third_party/closure/compiler.jar \
--language_in ECMASCRIPT5 \
--language_out ECMASCRIPT3 \
--jscomp_error=* \
--jscomp_off=deprecatedAnnotations \
--extra_annotation_name=listens \
--extra_annotation_name=exportDoc \
--conformance_configs build/conformance.textproto \
-O ADVANCED \
--generate_exports \
--output_wrapper_file=build/wrapper.template.js \
-D COMPILED=true \
-D goog.DEBUG=false \
-D goog.STRICT_MODE_COMPATIBLE=true \
-D goog.ENABLE_DEBUG_LOADER=false \
-D goog.asserts.ENABLE_ASSERTS=false \
-D shaka.log.MAX_LOG_LEVEL=0 \
-D 'GIT_VERSION="v2.0.0-beta2-138-ge7c29c0"' \
--jscomp_off=missingRequire \
--jscomp_off=strictMissingRequire \
--checks-only \
-O SIMPLE \
lib/util/fake_event_target.js \
test/offline/db_engine_unit.js \
test/test/util/simple_fakes.js \
test/net/data_uri_plugin_unit.js \
externs/msmediakeys.js \
demo/main.js \
externs/prefixed_eme.js \
lib/polyfill/patchedmediakeys_webkit.js \
lib/util/stream_utils.js \
demo/receiver_app.js \
test/net/networking_engine_unit.js \
lib/dash/segment_template.js \
demo/demo_utils.js \
lib/offline/download_manager.js \
test/cast/cast_receiver_unit.js \
test/dash/dash_parser_segment_list_unit.js \
lib/polyfill/fullscreen.js \
test/offline/offline_integration.js \
lib/offline/offline_manifest_parser.js \
test/media/ttml_text_parser_unit.js \
lib/debug/timer.js \
externs/xmlhttprequest.js \
test/test/util/fake_media_source_engine.js \
third_party/closure/goog/base.js \
lib/media/segment_reference.js \
lib/polyfill/patchedmediakeys_ms.js \
lib/net/data_uri_plugin.js \
lib/offline/offline_scheme.js \
lib/offline/offline_utils.js \
externs/mediakeys.js \
externs/shaka/net.js \
demo/assets.js \
lib/media/manifest_parser.js \
test/media/drm_engine_unit.js \
test/media/streaming_engine_integration.js \
lib/cast/cast_receiver.js \
lib/polyfill/promise.js \
test/util/ebml_parser_unit.js \
lib/media/mp4_ttml_parser.js \
test/abr/simple_abr_manager_unit.js \
test/test/util/fake_networking_engine.js \
test/util/xml_utils_unit.js \
test/media/streaming_engine_unit.js \
lib/util/map_utils.js \
lib/polyfill/mediakeys.js \
lib/cast/cast_sender.js \
test/test/util/manifest_generator.js \
test/test/externs/karma.js \
lib/util/array_utils.js \
test/test/util/dash_parser_util.js \
test/player_unit.js \
test/dash/dash_parser_live_unit.js \
test/util/string_utils_unit.js \
lib/abr/simple_abr_manager.js \
lib/debug/log.js \
lib/net/http_plugin.js \
test/media/mp4_vtt_parser_unit.js \
test/media/media_source_engine_integration.js \
test/test/util/util.js \
lib/util/mp4_parser.js \
lib/cast/cast_utils.js \
lib/util/pssh.js \
lib/media/mp4_vtt_parser.js \
test/dash/dash_parser_segment_base_unit.js \
lib/dash/content_protection.js \
lib/util/xml_utils.js \
test/test/util/streaming_engine_util.js \
test/media/media_source_engine_unit.js \
test/media/presentation_timeline_unit.js \
lib/util/public_promise.js \
test/dash/mpd_utils_unit.js \
third_party/closure/goog/uri/utils.js \
demo/asset_section.js \
externs/fullscreen.js \
lib/util/string_utils.js \
lib/abr/ewma.js \
test/media/text_engine_unit.js \
lib/util/ebml_parser.js \
demo/configuration_section.js \
test/dash/dash_parser_segment_template_unit.js \
lib/util/fake_event.js \
lib/media/time_ranges_utils.js \
demo/load.js \
lib/util/cancelable_chain.js \
lib/dash/segment_list.js \
lib/media/drm_engine.js \
test/test/externs/jasmine.js \
lib/util/error.js \
lib/util/timer.js \
test/util/fake_event_target_unit.js \
lib/polyfill/patchedmediakeys_nop.js \
lib/util/language_utils.js \
lib/dash/mpd_utils.js \
lib/util/event_manager.js \
demo/info_section.js \
lib/media/media_source_engine.js \
lib/media/vtt_text_parser.js \
demo/log_section.js \
test/net/http_plugin_unit.js \
test/dash/dash_parser_content_protection_unit.js \
lib/util/uint8array_utils.js \
test/offline/storage_unit.js \
lib/debug/asserts.js \
test/media/mp4_segment_index_parser_unit.js \
lib/media/segment_index.js \
externs/shaka/offline.js \
lib/media/mp4_segment_index_parser.js \
lib/media/presentation_timeline.js \
externs/shaka/abr_manager.js \
lib/media/text_engine.js \
lib/media/playhead.js \
lib/util/multi_map.js \
lib/media/ttml_text_parser.js \
test/util/data_view_reader_unit.js \
lib/offline/db_engine.js \
lib/util/data_view_reader.js \
test/util/event_manager_unit.js \
lib/util/config_utils.js \
lib/util/functional.js \
test/media/mp4_ttml_parser_unit.js \
externs/shaka/namespace.js \
test/media/playhead_unit.js \
test/media/segment_index_unit.js \
externs/chromecast.js \
externs/shaka/manifest_parser.js \
test/player_integration.js \
test/cast/cast_sender_unit.js \
test/test/util/memory_db_engine.js \
test/test/util/stream_generator.js \
lib/net/networking_engine.js \
test/test/externs/sprintf.js \
lib/offline/storage.js \
externs/shaka/player.js \
test/test/externs/require.js \
lib/dash/dash_parser.js \
third_party/closure/goog/uri/uri.js \
lib/util/text_parser.js \
lib/polyfill/videoplaybackquality.js \
lib/media/webm_segment_index_parser.js \
lib/media/streaming_engine.js \
test/dash/dash_parser_manifest_unit.js \
lib/dash/segment_base.js \
lib/polyfill/all.js \
test/media/vtt_text_parser_unit.js \
lib/abr/ewma_bandwidth_estimator.js \
test/util/text_parser_unit.js \
lib/player.js \
externs/jwk_set.js \
test/util/pssh_unit.js \
demo/controls.js \
lib/util/i_destroyable.js \
test/cast/cast_utils_unit.js \
test/util/cancelable_chain_unit.js \
test/cast/cast_proxy_unit.js \
externs/shaka/manifest.js \
lib/cast/cast_proxy.js \
test/media/drm_engine_integration.js \
demo/offline_section.js \
test/test/util/test_scheme.js;

@joeyparrish
Copy link
Member

Wow, that's crazy. How about we sort the files in python before passing them to the compiler?

@joeyparrish
Copy link
Member

Sorting the files list in build_raw() fixed all the compiler errors for me.

@hochhaus
Copy link
Contributor Author

hochhaus commented Jul 26, 2016

That is awesome that a fix is so simple. However, isn't this a sign of a larger problem? As build/all.py is not passing any --dependency_mode it means that NONE is used. Therefore, the order of files passed to the compiler is relevant. By doing an alphabetical sort are we not just "getting lucky" that the ordering is correct? In other words, I think that if some of the files were simply renamed the build could fail again. I think a better fix would be to use a dependency aware sort.

What are your thoughts?

@joeyparrish
Copy link
Member

I was honestly not familiar with --dependency_mode until I looked it up just now.

We should fix this through --dependency_mode. Does --entry_point support a file full of requires? If so, we can use shaka-player.uncompiled.js as the entry point, since this already has to list all the exported classes an app might use.

@hochhaus
Copy link
Contributor Author

Good idea about shaka-player.uncompiled.js. If we use --dependency_mode=LOOSE any file without a goog.provide or goog.module will be retained. So as long as we pass shaka-player.uncompiled.js all of the goog.require() in it will be retained as well.

@googlebot
Copy link

We found a Contributor License Agreement for you (the sender of this pull request) and all commit authors, but as best as we can tell these commits were authored by someone else. If that's the case, please add them to this pull request and have them confirm that they're okay with these commits being contributed to Google. If we're mistaken and you did author these commits, just reply here to confirm.

@googlebot
Copy link

CLAs look good, thanks!

@hochhaus
Copy link
Contributor Author

hochhaus commented Jul 26, 2016

As the testing code does not use goog.provide/goog.require the compiler is having problems sorting those files correctly. Can we merge this PR with the files.sort() fix to land the new compiler?

I'm looking into a more complete fix for the dependency_mode. Either way, I think the command lines we build shouldn't depend on ordering returned by os.walk() so sorting the files in python is a good idea even after we use dependency_mode.

@joeyparrish
Copy link
Member

I double-checked, and as it should be, everything in lib/ has a goog.provide.

The testing code doesn't need dependency tracking, as we don't really compile it. We just check it for type errors so we can catch more mistakes in our test code before they show up as test failures.

We can definitely also sort the files in python, though.

@hochhaus
Copy link
Contributor Author

hochhaus commented Jul 26, 2016

I moved the discussion of --dependency_mode to #465. I think this change can be reviewed/merged
as-is.

PTAL

@joeyparrish
Copy link
Member

The tests are not compiled. We run the compiler over them with --checks-only to catch mistakes early.

The test runner serves up all library code, uncompiled, followed by all test code. It uses closure to bootstrap the library through shaka-player.uncompiled.js. The Karma config controls everything. See the "files" array in karma.conf.js.

@hochhaus
Copy link
Contributor Author

The tests are not compiled. We run the compiler over them with --checks-only to catch mistakes early.

True. But even --checks-only code needs the types to be declared in the correct order. Therefore, source file ordering matters for --checks-only compiler invocations. See an example in #465.

@joeyparrish
Copy link
Member

Okay, let's discuss dependency mode in #465 as you suggested. One more pass through the build bot, and then we'll merge this.

@hochhaus
Copy link
Contributor Author

Thanks for all your help! I really appreciate it.

@joeyparrish
Copy link
Member

No problem. Thank you for contributing!

@shaka-bot
Copy link
Collaborator

Testing in progress...

@shaka-bot
Copy link
Collaborator

All tests passed!

@joeyparrish joeyparrish merged commit efaba56 into shaka-project:master Jul 26, 2016
@hochhaus hochhaus deleted the ver branch July 26, 2016 20:57
@github-actions github-actions bot added the status: archived Archived and locked; will not be updated label Jul 25, 2023
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jul 25, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
status: archived Archived and locked; will not be updated
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants